home *** CD-ROM | disk | FTP | other *** search
- Beschreibung des VDI-Fehlers, der durch VDI-FIX behoben wird
- ########################################################################
-
- Die VDI_Workstations werden intern als verkettete, sortierte Liste
- verwaltet. Der Fehler tritt auf, wenn Lücken in der Liste entstehen,
- jeder neue VDI-Block wird dann fasch einsortiert und es wird immer
- dasselbe VDI-Handle vergeben.
-
- Bei Einhängen wird folgendermaßen vorgegangen. Block 1 wird auf Handle
- 1, Block 2 auf Handle 2 usw. getestet. Wenn kein Block fehlt, wird ein
- Block angehängt, wenn einer fehlt, so wird dieser neu vergeben.
- Und genau da lauert der Fehler ! Der neue Block wird hinter den
- gefundenen Block gehangen, so daß beim nächsten Öffnen einer WK wieder
- derselbe Handle als fehlend festgestellt wird usw..
-
- Am Besten ein Beispiel :
-
- Vorgang Reihenfolge der Blöcke
- -------------------------------------------------------
- Existieren die WKs 1,2,3,4 1,2,3,4
- Nun schließt WK 3 1,2,4
- Prg A öffnet eine WK und
- erhält die 3,die ist aber
- falsch eingehängt 1,2,4,3
- Prg B öffnet auch eine WK
- und erhält wieder die 3 1,2,4,3,3
-
- Prg A und Prg B arbeiten als auf derselben Workstation und die Aufrufe
- zum setzen der Parameter laufen durcheinander. Setz Prg A GrosseSchrift
- und danach Prg B KleineSchrift, so werden auch die Ausgaben von Prg A
- in kleiner Schrift geschehen usw...
-
- Und dies alles nur, weil der Block dahinter, statt davor gehängt wurde !
-
- ########################################################################
-
- Hier nun der Code für v_opnvwk aus TOS 1.0 - 06.02.86 - $FCD4D8
- TOS 1.4 - 06.04.89 - $FCE22A
- TOS 1.6 - 29.07.89 - $E0E454
- TOS 030 - 23.05.89 - $E085BC
- MALLOC($134)
- move.l D0,A5 ; new = Malloc($134)
- ...
- Abbruch wenn kein Speicher erhalten
- ...
- move.w #1,D7 ; handle = 1
- move.l BASE,A4 ; wk = BASE
- bra Test ; while(handle == wk->handle) {
- Loop: addq #1,D7 ; handle++;
- tst.l 64(A4) ; if (!wk->next)
- beq End ; break;
- move.l 64(A4),A4 ; wk = wk->next;
- Test: cmp.w 40(A4),D7 ; /* In C eine WHILE-Schleife */
- beq Loop ; }
- End: tst.l 64(A4) ; if (!wk->next)
- bne InsertWK ; {
- move.l A5,D0 ; wk->next = new;
- move.l D0,64(A4) ;
- ... ; new->next= 0L;
- clr.l 64(A5) ; }
- bra Continue ; else
- Insert: move.l 64(A4),A3 ; {
- move.l A5,D0 ; hilf = wk->next;
- move.l D0,64(A4) ; wk->next = new;
- ... ; new->next= hilf;
- move.l A3,64(A5) ; }
- Cont: ... ;
- move.w D7,D0 ;
- ... ;
- move.w D0,40(A5) ; new->handle = handle;
- ...
-
- ########################################################################
-
- Karsten Isakovic
- Wilmersdorferstr.82
- 1000 Berlin
-
- Mailbox : Maus Münster, Maus München, Parrot Berlin
-